package com.gs.business.backup;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;

import android.os.Bundle;

import com.gs.R;
import com.gs.business.comadi.categorie.CommandInserisciListaCategorie;
import com.gs.business.comadi.entrate.CommandInserisciListaEntrate;
import com.gs.business.comadi.gruppi.CommandInserisciListaGruppi;
import com.gs.business.comadi.uscite.CommandInserisciListaUscite;
import com.gs.business.comadi.utenti.CommandInserisciListaUtenti;
import com.gs.domain.CatSpese;
import com.gs.domain.Entrate;
import com.gs.domain.Gruppi;
import com.gs.domain.SingleSpesa;
import com.gs.domain.Utenti;
import com.gs.domain.wrapper.WrapCatSpese;
import com.gs.domain.wrapper.WrapGruppi;
import com.gs.domain.wrapper.WrapUtenti;
import comi.gsi.view.MyBaseActivity;

public class RecuperaBackup extends MyBaseActivity {

	final private ArrayList<Entrate> entrate = new ArrayList<Entrate>();
	final private ArrayList<SingleSpesa> uscite = new ArrayList<SingleSpesa>();
	final private ArrayList<CatSpese> categorie = new ArrayList<CatSpese>();
	final private ArrayList<Gruppi> gruppi = new ArrayList<Gruppi>();
	final private ArrayList<Utenti> utenti = new ArrayList<Utenti>();

	@Override
	protected void myOnCreate(final Bundle savedInstanceState) throws Exception {
		recuperaBackup();
	}

	private void recuperaBackup() throws Exception {
		
		final FileInputStream fileGruppi = openFileInput(SaveBackup.getNomeFile(Gruppi.NOME_TABELLA));
		final String stringaGruppi = readFile(fileGruppi);
		stringaToEntities(stringaGruppi, Gruppi.NOME_TABELLA);
		
		final FileInputStream fileCategorie = openFileInput(SaveBackup.getNomeFile(CatSpese.NOME_TABELLA));
		final String stringaCategorie = readFile(fileCategorie);
		stringaToEntities(stringaCategorie, CatSpese.NOME_TABELLA);
		
		final FileInputStream fileUtenti = openFileInput(SaveBackup.getNomeFile(Utenti.NOME_TABELLA));
		final String stringaUtenti = readFile(fileUtenti);
		stringaToEntities(stringaUtenti, Utenti.NOME_TABELLA);
		
		final FileInputStream fileUscite = openFileInput(SaveBackup.getNomeFile(SingleSpesa.NOME_TABELLA));
		final String stringaUscite = readFile(fileUscite);
		stringaToEntities(stringaUscite, SingleSpesa.NOME_TABELLA);
		
		final FileInputStream fileEntrate = openFileInput(SaveBackup.getNomeFile(Entrate.NOME_TABELLA));
		final String stringaEntrate = readFile(fileEntrate);
		stringaToEntities(stringaEntrate, Entrate.NOME_TABELLA);
		
		lanciaComandi();

	}

	private void lanciaComandi() {
		
		final CommandInserisciListaGruppi inserisciListaGruppi = new CommandInserisciListaGruppi(gruppi);
		inserisciListaGruppi.execute();
		
		final CommandInserisciListaCategorie inserisciListaCategorie = new CommandInserisciListaCategorie(categorie);
		inserisciListaCategorie.execute();
		
		final CommandInserisciListaUtenti inserisciListaUtenti = new CommandInserisciListaUtenti(utenti);
		inserisciListaUtenti.execute();
		
		final CommandInserisciListaUscite inserisciListaUscite = new CommandInserisciListaUscite(uscite);
		inserisciListaUscite.execute();
		
		final CommandInserisciListaEntrate inserisciListaEntrate = new CommandInserisciListaEntrate(entrate);
		inserisciListaEntrate.execute();
	}

	private void stringaToEntities(final String stringaEntita, final String entitaName) {
		final String[] entita = stringaEntita.split(SaveBackup.SEP_RIGA);
		for (String element : entita) {
			riempiEntita(element, entitaName);
		}

	}

	private void riempiEntita(final String stringaEntita, final String entitaName) {
		if(stringaEntita != null && !"".equals(stringaEntita)){
			if (Gruppi.NOME_TABELLA.equals(entitaName)) {
				riempiEntitaGruppo(stringaEntita);
			} else if (CatSpese.NOME_TABELLA.equals(entitaName)) {
				riempiEntitaCategoria(stringaEntita);
			} else if (Utenti.NOME_TABELLA.equals(entitaName)) {
				riempiEntitaUtenti(stringaEntita);
			} else if (SingleSpesa.NOME_TABELLA.equals(entitaName)) {
				riempiEntitaUscita(stringaEntita);
			} else if (Entrate.NOME_TABELLA.equals(entitaName)) {
				riempiEntitaEntrata(stringaEntita);
			}
		}
	}

	private void riempiEntitaEntrata(final String stringaEntita) {
		final Entrate entrata = new Entrate();
		final String[] campiEntita = stringaEntita.split(SaveBackup.SEP);
		entrata.setidEntrate(Integer.parseInt(campiEntita[0]));
		entrata.setnome(campiEntita[1]);
		entrata.setdescrizione(campiEntita[2]);
		entrata.setdata(campiEntita[3]);
		entrata.setDataIns(campiEntita[4]);
		entrata.setFisseoVar(campiEntita[5]);
		if(campiEntita[6] != null && campiEntita[6].equals("null")){
			entrata.setinEuro(Double.parseDouble(campiEntita[6]));
		}
		if(campiEntita[7] != null && campiEntita[7].equals("null")){
			final WrapUtenti wrapUtenti = new WrapUtenti();
			final Utenti utente = (Utenti) wrapUtenti.selectById(Integer.parseInt(campiEntita[7]));
			entrata.setUtenti(utente);
		}
		entrate.add(entrata);
	}

	private void riempiEntitaUscita(final String stringaEntita) {
		final SingleSpesa uscita = new SingleSpesa();
		final String[] campiEntita = stringaEntita.split(SaveBackup.SEP);
		uscita.setidSpesa(Integer.parseInt(campiEntita[0]));
		uscita.setnome(campiEntita[1]);
		uscita.setdescrizione(campiEntita[2]);
		uscita.setData(campiEntita[3]);
		uscita.setDataIns(campiEntita[4]);
		uscita.setinEuro(Double.parseDouble(campiEntita[5]));

		if(campiEntita[6] != null && campiEntita[6].equals("null")){
			final WrapUtenti wUtenti = new WrapUtenti();
			final Utenti utente = (Utenti) wUtenti.selectById(Integer.parseInt(campiEntita[6]));
			uscita.setUtenti(utente);
		}
		if(campiEntita[7] != null && campiEntita[7].equals("null")){
			final WrapCatSpese wCatSpese = new WrapCatSpese();
			final CatSpese categoria = (CatSpese) wCatSpese.selectById(Integer.parseInt(campiEntita[7]));
			uscita.setCatSpese(categoria);
		}
		uscite.add(uscita);
	}

	private void riempiEntitaUtenti(final String stringaEntita) {
		final Utenti utente = new Utenti();
		final String[] campiEntita = stringaEntita.split(SaveBackup.SEP);
		utente.setidUtente(Integer.parseInt(campiEntita[0]));
		utente.setNome(campiEntita[1]);
		utente.setCognome(campiEntita[2]);
		utente.setusername(campiEntita[3]);
		utente.setpassword(campiEntita[4]);
		utenti.add(utente);
		
	}

	private void riempiEntitaCategoria(final String stringaEntita) {
		final CatSpese categoria = new CatSpese();
		final String[] campiEntita = stringaEntita.split(SaveBackup.SEP);
		categoria.setidCategoria(Integer.parseInt(campiEntita[0]));
		categoria.setnome(campiEntita[1]);
		categoria.setdescrizione(campiEntita[2]);

		if(!campiEntita[3].equals(null) && !campiEntita[3].equals("null")){
			final WrapGruppi wGruppi = new WrapGruppi();
			final Gruppi gruppo = (Gruppi) wGruppi.selectById(Integer.parseInt(campiEntita[3]));
			categoria.setGruppi(gruppo);
		}
		categoria.setimportanza(campiEntita[4]);
		categorie.add(categoria);
	}

	private void riempiEntitaGruppo(final String stringaEntita) {
		final Gruppi gruppo = new Gruppi();
		final String[] campiEntita = stringaEntita.split(SaveBackup.SEP);
		gruppo.setidGruppo(Integer.parseInt(campiEntita[0]));
		gruppo.setnome(campiEntita[1]);
		gruppo.setdescrizione(campiEntita[2]);
		gruppi.add(gruppo);

	}

	private String readFile(final FileInputStream file) throws IOException {
		int ch;
		StringBuffer strContent = new StringBuffer("");
		while ((ch = file.read()) != -1) {
			strContent.append((char) ch);
		}

		file.close();
		return strContent.toString();
	}

	@Override
	protected int getIdLayout() {
		return R.layout.admin;
	}
}
